home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / BMSRC.ZIP / RENDER.S < prev    next >
Encoding:
Text File  |  1996-11-23  |  40.4 KB  |  1,504 lines

  1. *=======================================================*
  2. *    Rendering module: latest update 25/03/96    *
  3. *=======================================================*
  4. *    Render walls & floors onto screenbuffer        *
  5. *=======================================================*
  6.  
  7. *-------------------------------------------------------*
  8. *    Texel addressing units [horizontal]        *
  9. *-------------------------------------------------------*
  10.  
  11. *-------------------------------------------------------*
  12. *    8-bit texel -> 16-bit pixel unit        *
  13. *-------------------------------------------------------*
  14.  
  15. hrun16    macro
  16.     move.l        d3,d0
  17.     move.w        d1,d0
  18.     lsr.l        #6,d0
  19.     lsr.w        #4,d0
  20.     move.b        (a1,d0.w),d6
  21.     add.l        d7,d3
  22.     move.w        (a0,d6.l*2),d0
  23.     add.w        d4,d1
  24.     move.w        d0,(a6)+
  25.     endm
  26.  
  27. *-------------------------------------------------------*
  28. *    8-bit texel -> 32-bit (double) pixel unit    *
  29. *-------------------------------------------------------*
  30.  
  31. hrun32s    macro
  32.     move.l        d7,a4
  33.     move.l        d3,d7
  34.     move.w        d1,d7
  35.     lsr.l        #6,d7
  36.     lsr.w        #4,d7
  37.     move.b        (a1,d7.w),d6
  38.     add.l        a4,d3
  39.     move.w        (a0,d6.l*2),d7
  40.     add.w        d4,d1
  41.     endm
  42.  
  43. hrun32    macro
  44.     move.l        d3,d0
  45.     move.w        d7,(a6)+
  46.     move.w        d1,d0
  47.     lsr.l        #6,d0
  48.     move.w        d7,(a6)+
  49.     lsr.w        #4,d0
  50.     move.b        (a1,d0.w),d6
  51.     add.l        a4,d3
  52.     move.w        (a0,d6.l*2),d7
  53.     add.w        d4,d1
  54.     endm
  55.  
  56. *-------------------------------------------------------*
  57. *    8-bit scaled -> 16-bit pixel unit        *
  58. *-------------------------------------------------------*
  59.  
  60. srun16    macro                ; 14
  61.     move.w        d3,d0
  62.     and.w        d4,d0
  63.     move.b        (a1,d0.w*8),d6
  64.     addx.l        d7,d3
  65.     move.w        (a0,d6.l*2),(a6)+
  66.     endm
  67.  
  68. *-------------------------------------------------------*
  69. *    8-bit scaled -> 32-bit (double) pixel unit    *
  70. *-------------------------------------------------------*
  71.  
  72. srun32    macro
  73.     move.w        d3,d0
  74.     and.w        d4,d0
  75.     move.b        (a1,d0.w*8),d6
  76.     addx.l        d7,d3
  77.     move.w        (a0,d6.l*2),d0
  78.     move.w        d0,(a6)+
  79.     move.w        d0,(a6)+
  80.     endm
  81.  
  82. *-------------------------------------------------------*
  83. *    Texel addressing units [vertical]        *
  84. *-------------------------------------------------------*
  85.  
  86. *-------------------------------------------------------*
  87. *    8-bit texel -> 16-bit pixel unit        *
  88. *-------------------------------------------------------*
  89.  
  90. vrun16    macro
  91.     and.w        d5,d4
  92.     move.b        (a2,d4.w),d1
  93.     addx.l        d3,d4
  94.     move.w        (a5,d1.l*2),d0
  95.     adda.l        a6,a0
  96.     move.w        d0,(a0)
  97.     endm
  98.  
  99. *-------------------------------------------------------*
  100. *    8-bit texel -> 32-bit (double) pixel unit    *
  101. *-------------------------------------------------------*
  102.  
  103. vrun32    macro
  104.     and.w        d5,d4
  105.     move.b        (a2,d4.w),d1
  106.     addx.l        d3,d4
  107.     move.w        (a5,d1.l*2),d0
  108.     adda.l        a6,a0
  109.     move.w        d0,(a0)+
  110.     move.w        d0,(a0)
  111.     endm
  112.  
  113. *-------------------------------------------------------*
  114. *    Transparent texel addressing units [vertical]    *
  115. *-------------------------------------------------------*
  116.  
  117. *-------------------------------------------------------*
  118. *    8-bit texel -> 16-bit pixel unit        *
  119. *-------------------------------------------------------*
  120.  
  121. tvrun16    macro                ; 16
  122.     and.w        d5,d4
  123.     move.b        (a2,d4.w),d1
  124.     beq.s        .tp\@
  125.     move.w        (a5,d1.l*2),(a0)
  126. .tp\@:    addx.l        d3,d4
  127.     adda.l        a6,a0
  128.     endm
  129.  
  130. *-------------------------------------------------------*
  131. *    8-bit texel -> 32-bit (double) pixel unit    *
  132. *-------------------------------------------------------*
  133.  
  134. tvrun32    macro                ; 20
  135.     and.w        d5,d4
  136.     move.b        (a2,d4.w),d1
  137.     beq.s        .tp\@
  138.     move.w        (a5,d1.l*2),d0
  139.     move.w        d0,(a0)
  140.     move.w        d0,2(a0)
  141. .tp\@:    addx.l        d3,d4
  142.     adda.l        a6,a0
  143.     endm
  144.  
  145. *-------------------------------------------------------*
  146. *    QuickAlpha texel addressing units [vertical]    *
  147. *-------------------------------------------------------*
  148.  
  149. *-------------------------------------------------------*
  150. *    8-bit texel -> 16-bit pixel unit        *
  151. *-------------------------------------------------------*
  152.  
  153. avrun16    macro                ; 10
  154.     move.w        (a0,a6.l),d1
  155.     adda.l        a6,a0
  156.     move.w        (a5,d1.l*2),(a0)
  157.     endm
  158.  
  159. *-------------------------------------------------------*
  160. *    8-bit texel -> 32-bit (double) pixel unit    *
  161. *-------------------------------------------------------*
  162.  
  163. avrun32    macro                ; 14
  164.     move.w        (a0,a6.l),d1
  165.     adda.l        a6,a0
  166.     move.w        (a5,d1.l*2),d1
  167.     move.w        d1,(a0)+
  168.     move.w        d1,(a0)+
  169.     endm
  170.  
  171. *-------------------------------------------------------*
  172. *    Render the floors & ceilings            *
  173. *-------------------------------------------------------*
  174. render_flats:
  175. *-------------------------------------------------------*
  176.     tst.b        halfrows
  177.     bne        render_flats_2x1
  178.  
  179. *-------------------------------------------------------*
  180.     txtlong
  181. *-------------------------------------------------------*
  182. render_flats_1x1:
  183. *-------------------------------------------------------*
  184.     moveq        #rotatemap_command,d0
  185.     dspwrite.l    d0
  186. *-------------------------------------------------------*
  187.     move.l        screen,.local_screen
  188.     lea        zone_space,a3
  189. *-------------------------------------------------------*
  190.     lea        DSPHost16.w,a4
  191.     lea        DSPHostStat.w,a5
  192. *-------------------------------------------------------*
  193. *    Zone loop                    *
  194. *-------------------------------------------------------*
  195. .zone_loop:
  196. *-------------------------------------------------------*
  197.     moveq        #0,d4
  198.     move.b        (a3)+,d4            ; [zone_lines]
  199.     moveq        #0,d0
  200.     subq.w        #1,d4
  201.     bmi        .last_zone
  202. *-------------------------------------------------------*
  203.     move.b        (a3)+,d0            ; [zone_texture]
  204.     cmp.w        sky_index,d0
  205.     beq        .scaled_chunk
  206. *-------------------------------------------------------*
  207. .perspected_chunk:    
  208. *-------------------------------------------------------*
  209.     bsr        cache_resource
  210.     move.l        d0,a1
  211.     move.w        (a3)+,d0            ; [zone_start]
  212.     move.l        .local_screen(pc),a2
  213.     mulu.w        bytewidth,d0
  214.     add.l        d0,a2
  215. *-------------------------------------------------------*
  216. .pline_loop:
  217. *-------------------------------------------------------*
  218.     move.w        (a3)+,d2            ; [line_runs]
  219.     swap        d4
  220.     subq.w        #1,d2
  221.     bmi        .pnull_line
  222. *-------------------------------------------------------*
  223. .prun_loop:
  224. *-------------------------------------------------------*
  225.     dspwaitread.0    (a5)
  226.     move.w        (a4),d7                ; map_xi
  227.     dspwaitread.4    (a5)
  228.     move.w        (a4),d3                ; map_x
  229.     dspwaitread.4    (a5)
  230.     move.w        (a4),d4                ; map_yi
  231.     dspwaitread.4    (a5)
  232.     move.w        (a4),d1                ; map_y
  233.     dspwaitread.4    (a5)
  234.     move.w        (a4),d6                ; x1
  235. *-------------------------------------------------------*
  236. *    Render flat run                    *
  237. *-------------------------------------------------------*
  238.     lea        colourtables,a0
  239.     moveq        #0,d0
  240.     move.w        (a3)+,d0
  241.     lsl.l        #6,d3
  242.     lsl.l        #6,d7
  243.     swap        d2
  244.     move.w        (a3)+,d2
  245.     lsl.l        #8,d0
  246.     add.l        d0,d0
  247.     add.l        d0,a0
  248.     lea        (a2,d6.w*2),a6
  249.     sub.w        d6,d2
  250.     moveq        #4-1,d0
  251.     and.w        d2,d0
  252.     lsr.w        #2,d2                ; dx{loop}
  253.     moveq        #0,d6
  254. *-------------------------------------------------------*
  255. *    Flat-rendering instruction tower        *
  256. *-------------------------------------------------------*
  257.     jmp        .pdx_l(pc,d0.w*2)        ; index instruction tower
  258. .pdx_l:    bra.s        .o00
  259.     bra.s        .o01
  260.     bra.s        .o02
  261.     bra.s        .o03
  262. .o04    hrun16
  263. .o03    hrun16
  264. .o02    hrun16
  265. .o01    hrun16
  266. .o00    dbra        d2,.o04
  267. *-------------------------------------------------------*
  268. .o0d:    swap        d2
  269.     dbra        d2,.prun_loop
  270. *-------------------------------------------------------*
  271. .pnull_line:
  272. *-------------------------------------------------------*
  273.     add.w        bytewidth,a2
  274.     swap        d4
  275.     dbra        d4,.pline_loop
  276. *-------------------------------------------------------*
  277.     bra        .zone_loop
  278. *-------------------------------------------------------*
  279. .scaled_chunk:    
  280. *-------------------------------------------------------*
  281.     move.l        #.err,d5
  282.     move.w        current_sky,d0
  283.     bmi.s        .err
  284.     bsr        cache_resource
  285.     move.l        d0,d5
  286. *-------------------------------------------------------*
  287. .err:    move.l        skyx(pc),d7                ; sxi
  288.     lea        colourtables+63*(2*256),a0
  289.     moveq        #0,d0
  290.     move.w        (a3)+,d0            ; [zone_start]
  291.     move.l        .local_screen(pc),a2
  292.     move.l        d0,d1
  293.     mulu.w        bytewidth,d0
  294.     swap        d7
  295.     add.l        d0,a2
  296. *-------------------------------------------------------*
  297. .sline_loop:
  298. *-------------------------------------------------------*
  299.     move.w        (a3)+,d2            ; [line_runs]
  300.     swap        d4
  301.     subq.w        #1,d2
  302.     bmi        .snull_line
  303. *-------------------------------------------------------*
  304. .srun_loop:
  305. *-------------------------------------------------------*
  306.     addq.l        #2,a3
  307.     lea        1(a4),a1
  308.     dspwaitread.0    (a5)
  309.     tst.b        (a1)                ; map_xi
  310.     dspwaitread.4    (a5)
  311.     tst.b        (a1)                ; map_x
  312.     dspwaitread.4    (a5)
  313.     tst.b        (a1)                ; map_yi
  314.     dspwaitread.4    (a5)
  315.     tst.b        (a1)                ; map_y    
  316.     dspwaitread.4    (a5)
  317.     move.w        (a4),d6                ; x1
  318. *-------------------------------------------------------*
  319.     moveq        #128-1,d0
  320.     and.w        d1,d0
  321.     mulu.l        skyy(pc),d0
  322.     move.l        d5,a1
  323.     clr.w        d0
  324.     swap        d0
  325.     add.l        d0,a1
  326. *-------------------------------------------------------*
  327.     moveq        #0,d3
  328.     move.w        d6,d3
  329.     swap        d7
  330.     muls.l        d7,d3
  331.     add.l        xoff(pc),d3
  332.     move.w        #%0000111111110000,d4
  333.     swap        d7
  334.     swap        d3
  335. *-------------------------------------------------------*
  336. *    Render flat run                    *
  337. *-------------------------------------------------------*
  338.     swap        d2
  339.     move.w        (a3)+,d2
  340. *-------------------------------------------------------*
  341.     lea        (a2,d6.w*2),a6
  342. *-------------------------------------------------------*
  343.     sub.w        d6,d2
  344.     moveq        #4-1,d0
  345.     and.w        d2,d0
  346.     lsr.w        #2,d2                ; dx{loop}
  347.     move.w        d3,d6
  348.     add.l        d7,d3
  349.     move.w        d6,d3
  350.     moveq        #0,d6
  351. *-------------------------------------------------------*
  352. *    Flat-rendering instruction tower        *
  353. *-------------------------------------------------------*
  354.     jmp        .sdx_l(pc,d0.w*2)        ; index instruction tower
  355. .sdx_l:    bra.s        .o10
  356.     bra.s        .o11
  357.     bra.s        .o12
  358.     bra.s        .o13
  359. .o14    srun16
  360. .o13    srun16
  361. .o12    srun16
  362. .o11    srun16
  363. .o10    dbra        d2,.o14
  364. *-------------------------------------------------------*
  365.     swap        d2
  366.     dbra        d2,.srun_loop
  367. *-------------------------------------------------------*
  368. .snull_line:
  369. *-------------------------------------------------------*
  370. ;    lea        (max_xres*2)(a2),a2
  371.     add.w        bytewidth,a2
  372.     addq.l        #1,d1
  373.     swap        d4
  374.     dbra        d4,.sline_loop
  375. *-------------------------------------------------------*
  376.     bra        .zone_loop
  377. *-------------------------------------------------------*
  378. .last_zone:
  379. *-------------------------------------------------------*
  380. .stop:    rts
  381.     
  382. *-------------------------------------------------------*
  383. *    Local variables                    *
  384. *-------------------------------------------------------*
  385. .local_screen:        ds.l    1
  386. *-------------------------------------------------------*
  387.  
  388. *-------------------------------------------------------*
  389.     txtlong
  390. *-------------------------------------------------------*
  391. render_flats_2x1:
  392. *-------------------------------------------------------*
  393.     moveq        #rotatemap_command,d0
  394.     dspwrite.l    d0
  395. *-------------------------------------------------------*
  396.     move.l        screen,.local_screen
  397.     lea        zone_space,a3
  398. *-------------------------------------------------------*
  399.     lea        DSPHostStat.w,a5
  400. *-------------------------------------------------------*
  401. *    Zone loop                    *
  402. *-------------------------------------------------------*
  403. .zone_loop:
  404. *-------------------------------------------------------*
  405.     moveq        #0,d4
  406.     move.b        (a3)+,d4            ; [zone_lines]
  407.     moveq        #0,d0
  408.     subq.w        #1,d4
  409.     bmi        .last_zone
  410. *-------------------------------------------------------*
  411.     move.b        (a3)+,d0            ; [zone_texture]
  412.     cmp.w        sky_index,d0
  413.     beq        .scaled_chunk
  414. *-------------------------------------------------------*
  415. .perspected_chunk:
  416. *-------------------------------------------------------*
  417.     bsr        cache_resource
  418.     move.l        d0,a1
  419.     move.w        (a3)+,d0            ; [zone_start]
  420.     move.l        .local_screen(pc),a2
  421.     mulu.w        bytewidth,d0
  422.     add.l        d0,a2
  423. *-------------------------------------------------------*
  424. .line_loop:
  425. *-------------------------------------------------------*
  426.     move.w        (a3)+,d2            ; [line_runs]
  427.     swap        d4
  428.     subq.w        #1,d2
  429.     bmi        .null_line
  430. *-------------------------------------------------------*
  431. .run_loop:
  432. *-------------------------------------------------------*
  433.     lea        DSPHost16.w,a4
  434.     dspwaitread.0    (a5)
  435.     move.w        (a4),d7                ; map_xi
  436.     dspwaitread.4    (a5)
  437.     move.w        (a4),d3                ; map_x
  438.     dspwaitread.4    (a5)
  439.     move.w        (a4),d4                ; map_yi
  440.     dspwaitread.4    (a5)
  441.     move.w        (a4),d1                ; map_y
  442.     dspwaitread.4    (a5)
  443.     move.w        (a4),d6                ; x1
  444. *-------------------------------------------------------*
  445. *    Render flat run                    *
  446. *-------------------------------------------------------*
  447.     lea        colourtables,a0
  448.     moveq        #0,d0
  449.     move.w        (a3)+,d0
  450.     lsl.l        #6,d3
  451.     lsl.l        #6,d7
  452.     swap        d2
  453.     move.w        (a3)+,d2
  454.     lsl.l        #8,d0
  455.     add.l        d0,d0
  456.     add.l        d0,a0
  457.     lea        (a2,d6.w*4),a6
  458.     addq.w        #1,d6
  459.     sub.w        d6,d2
  460.     moveq        #4-1,d0
  461.     and.w        d2,d0
  462.     lsr.w        #2,d2                ; dx{loop}
  463.     move.l        d0,d6
  464.     lsl.w        #2,d6
  465.     sub.w        d6,d0                ; dx{remainder} * -24
  466. *-------------------------------------------------------*
  467. *    Flat-rendering instruction tower        *
  468. *-------------------------------------------------------*
  469.     hrun32s
  470.     jmp        .dx_j(pc,d0.w*8)        ; index instruction tower
  471. .dx_l:    hrun32
  472.     hrun32
  473.     hrun32
  474.     hrun32
  475. .dx_j:    dbra        d2,.dx_l
  476.     move.w        d7,(a6)+
  477.     move.w        d7,(a6)+
  478. *-------------------------------------------------------*
  479.     swap        d2
  480.     dbra        d2,.run_loop
  481. *-------------------------------------------------------*
  482. .null_line:
  483. *-------------------------------------------------------*
  484. ;    lea        (max_xres*2)(a2),a2
  485.     add.w        bytewidth,a2
  486.     swap        d4
  487.     dbra        d4,.line_loop
  488. *-------------------------------------------------------*
  489.     bra        .zone_loop
  490. *-------------------------------------------------------*
  491. .scaled_chunk:    
  492. *-------------------------------------------------------*
  493.     move.l        #.err,d5
  494.     move.w        current_sky,d0
  495.     bmi.s        .err
  496.     bsr        cache_resource
  497.     move.l        d0,d5
  498. *-------------------------------------------------------*
  499. .err:    move.l        skyx(pc),d7                ; sxi
  500.     lea        colourtables+63*(2*256),a0
  501.     moveq        #0,d0
  502.     move.w        (a3)+,d0            ; [zone_start]
  503.     move.l        .local_screen(pc),a2
  504.     move.l        d0,d1
  505.     mulu.w        bytewidth,d0
  506.     swap        d7
  507.     add.l        d0,a2
  508. *-------------------------------------------------------*
  509. .sline_loop:
  510. *-------------------------------------------------------*
  511.     move.w        (a3)+,d2            ; [line_runs]
  512.     swap        d4
  513.     subq.w        #1,d2
  514.     bmi        .snull_line
  515. *-------------------------------------------------------*
  516. .srun_loop:
  517. *-------------------------------------------------------*
  518.     addq.l        #2,a3
  519.     lea        DSPHost16.w,a4
  520.     lea        1(a4),a1
  521.     dspwaitread.0    (a5)
  522.     tst.b        (a1)                ; map_xi
  523.     dspwaitread.4    (a5)
  524.     tst.b        (a1)                ; map_x
  525.     dspwaitread.4    (a5)
  526.     tst.b        (a1)                ; map_yi
  527.     dspwaitread.4    (a5)
  528.     tst.b        (a1)                ; map_y    
  529.     dspwaitread.4    (a5)
  530.     move.w        (a4),d6                ; x1
  531. *-------------------------------------------------------*
  532.     move.l        skyy(pc),d0
  533.     move.l        d5,a1
  534.     mulu.l        d1,d0
  535.     clr.w        d0
  536.     swap        d0
  537.     add.l        d0,a1
  538. *-------------------------------------------------------*
  539.     moveq        #0,d3
  540.     move.w        d6,d3
  541.     swap        d7
  542.     mulu.l        d7,d3
  543.     add.l        xoff(pc),d3
  544.     move.w        #%0000111111110000,d4
  545.     swap        d7
  546.     swap        d3
  547. *-------------------------------------------------------*
  548. *    Render flat run                    *
  549. *-------------------------------------------------------*
  550.     swap        d2
  551.     move.w        (a3)+,d2
  552. *-------------------------------------------------------*
  553.     lea        (a2,d6.w*4),a6
  554. *-------------------------------------------------------*
  555.     sub.w        d6,d2
  556.     moveq        #4-1,d0
  557.     and.w        d2,d0
  558.     asr.w        #2,d2                ; dx{loop}
  559. *-------------------------------------------------------*
  560.     move.l        d0,d6
  561.     lsl.w        #3,d6
  562.     add.w        d6,d0                ; dx{remainder} * -9
  563.     neg.w        d0
  564. *-------------------------------------------------------*
  565.     move.w        d3,d6
  566.     add.l        d7,d3
  567.     move.w        d6,d3
  568.     moveq        #0,d6
  569. *-------------------------------------------------------*
  570. *    Flat-rendering instruction tower        *
  571. *-------------------------------------------------------*
  572.     jmp        .sdx_j(pc,d0.w*2)        ; index instruction tower
  573. .sdx_l:    srun32
  574.     srun32
  575.     srun32
  576.     srun32
  577. .sdx_j:    dbra        d2,.sdx_l
  578. *-------------------------------------------------------*
  579.     swap        d2
  580.     dbra        d2,.srun_loop
  581. *-------------------------------------------------------*
  582. .snull_line:
  583. *-------------------------------------------------------*
  584.     add.w        bytewidth,a2
  585. ;    lea        (max_xres*2)(a2),a2
  586.     addq.l        #1,d1
  587.     swap        d4
  588.     dbra        d4,.sline_loop
  589. *-------------------------------------------------------*
  590.     bra        .zone_loop
  591. *-------------------------------------------------------*
  592. .last_zone:
  593. *-------------------------------------------------------*
  594. .stop:    rts
  595.  
  596. *-------------------------------------------------------*
  597. *    Local variables                    *
  598. *-------------------------------------------------------*
  599. .local_screen:        ds.l    1
  600. *-------------------------------------------------------*
  601.  
  602.     rept        0
  603.  
  604. vrun    macro
  605.     and.w        d5,d4
  606.     move.b        (a2,d4.w),d1
  607.     addx.l        d3,d4
  608.     move.w        (a5,d1.l*2),d0
  609.     adda.l        a6,a0
  610.     move.w        d0,(a0)
  611.     endm
  612.  
  613. *-------------------------------------------------------*
  614. *    Render the walls                *
  615. *-------------------------------------------------------*
  616.     txtlong
  617. *-------------------------------------------------------*
  618. render_walls:
  619. *-------------------------------------------------------*
  620.     rts
  621.     lea        wallruns,a1
  622.     moveq        #0,d6
  623.     move.w        wallruncount,d6
  624.     subq.w        #1,d6
  625.     bmi        .err
  626.     move.l        screen,a4
  627.     moveq        #0,d5
  628.     move.w        bytewidth,d5
  629.     move.l        d5,a6
  630.     sub.l        a6,a4
  631.  
  632.     move.w        #128-1,d5
  633.  
  634. ;    i,j1j2,z,u,dv,v
  635.     
  636.     lea        wall_texture,a3
  637. *-------------------------------------------------------*
  638. *    Wall-column horizontal loop            *    
  639. *-------------------------------------------------------*
  640. .runs:    move.w        (a1)+,d3            ; i (screen)
  641.     moveq        #0,d1
  642.     move.b        (a1)+,d1            ; j1 (screen/top)
  643.     moveq        #0,d2
  644.     move.b        (a1)+,d2            ; j2 (screen/bot)
  645.     lea        colourtables,a5
  646.     lea        (a4,d3.w*2),a0            ; address screen (i)
  647.     sub.w        d1,d2                ; dj (height)
  648. ;    lsl.l        #4,d1
  649. ;    move.l        d1,d0
  650.     move.w        (a1)+,d4            ; u (texture)
  651. ;    lsl.l        #2,d1
  652. ;    add.l        d1,d0
  653. ;    lsl.l        #3,d0
  654.     move.l        (a1)+,d3            ; dv[i:f] (texture)
  655. ;    add.l        d0,a0                ; address j (screen)
  656.  
  657.     mulu.w        bytewidth,d1    ****
  658.     add.l        d1,a0                ; address j (screen)
  659.  
  660.     moveq        #0,d0
  661.     lea        (a3,d4.w),a2            ; address u (texture)
  662.     moveq        #0,d4
  663.     move.w        (a1)+,d4            ; v (texture)
  664.     move.b        d3,d0                ; luminance
  665.     lsl.l        #8,d0
  666.     add.l        d0,a5                ; address luminance table
  667.     asr.l        #8,d3
  668.     swap        d3
  669.     lsl.l        #8,d4
  670.     swap        d4
  671. *-------------------------------------------------------*
  672. *    Calculate tower index & interations        *
  673. *-------------------------------------------------------*
  674.     moveq        #4-1,d0
  675.     and.w        d2,d0                ; index = remainder(4)
  676.     lsr.w        #2,d2                ; loopsize / 4
  677.     neg.w        d0
  678.     add.w        d0,d0                ; index * -2
  679. *-------------------------------------------------------*
  680. *    Preload carry for cascading adder        *
  681. *-------------------------------------------------------*
  682.     move.w        d4,d1                ; store v[i]
  683.     add.l        d3,d4                ; v[i:f]=v[i:f]+dv[i:f]
  684.     move.w        d1,d4                ; restore v[i]
  685. *-------------------------------------------------------*
  686. *    Execute instruction tower            *
  687. *-------------------------------------------------------*
  688.     clr.l        d1
  689.     jmp        .dx_j(pc,d0.w*8)        ; jump -> index * -16
  690. .dx_l:    vrun
  691.     vrun
  692.     vrun
  693.     vrun
  694. .dx_j:    dbra        d2,.dx_l
  695. *-------------------------------------------------------*
  696. *    Address next wall column            *
  697. *-------------------------------------------------------*
  698.     dbra        d6,.runs
  699. .err:    rts
  700.  
  701.     endr
  702.  
  703. *-------------------------------------------------------*
  704. render_wall:
  705. *-------------------------------------------------------*
  706.     cmp.w        #texcode_none,wall_id
  707.     beq        flush_badwall
  708.     cmp.w        #texcode_sky,wall_id
  709.     beq        flush_badwall
  710. *-------------------------------------------------------*
  711.     tst.b        addwall_opaque(a6)
  712.     bne        stack_transparent
  713. *-------------------------------------------------------*
  714.     moveq        #0,d0
  715.     move.w        wall_id,d0
  716.     bmi.s        .err
  717.     bsr        cache_resource
  718.     move.l        d0,d6
  719. .err:    move.l        screen,a4
  720.     move.w        #128-1,d5
  721.     lea        DSPHost16.w,a1
  722.     lea        DSPHostStat.w,a3
  723. *-------------------------------------------------------*
  724.     tst.b        halfrows
  725.     bne        render_wall_2x1
  726.  
  727. *-------------------------------------------------------*
  728. render_wall_1x1:
  729. *-------------------------------------------------------*
  730.     move.w        bytewidth,a6
  731.     sub.l        a6,a4
  732. *-------------------------------------------------------*
  733.     dspwaitread.0    (a3)
  734.     move.w        (a1),d3                ; i (screen)
  735.     bmi        .dsp_done
  736. *-------------------------------------------------------*
  737. .next:    moveq        #0,d1
  738.     dspwaitread.0    (a3)
  739.     move.w        (a1),d1                ; j1j2
  740.     lea        colourtables,a5
  741.     lea        (a4,d3.w*2),a0            ; address screen (i)
  742.     moveq        #0,d2
  743.     move.b        d1,d2                ; j2 (screen/bot)
  744.     lsr.w        #8,d1                ; j1 (screen/top)
  745.     sub.w        d1,d2                ; dj (height)
  746. ;    lsl.l        #4,d1
  747. ;    move.l        d1,d0
  748.     dspwaitread.0    (a3)
  749.     move.w        (a1),d4                ; z
  750.     lea        (a5,d4.w*8),a5            ; address luminance table
  751.     moveq        #0,d4
  752.     dspwaitread.3    (a3)
  753.     move.w        (a1),d4                ; u (texture)
  754. ;    lsl.l        #2,d1
  755. ;    add.l        d1,d0
  756. ;    lsl.l        #3,d0
  757.     move.l        d6,a2
  758.     add.l        d4,a2                ; address u (texture)
  759.     dspwaitread.0    (a3)
  760.     move.l        -2(a1),d3            ; dv[i:f] (texture)
  761. ;    add.l        d0,a0                ; address j (screen)
  762.  
  763.     mulu.w        bytewidth,d1    ****
  764.     add.l        d1,a0
  765.     
  766.     moveq        #0,d4
  767.     swap        d3
  768.     ext.w        d3
  769.     dspwaitread.3    (a3)
  770.     move.w        (a1),d4                ; v (texture)
  771. *-------------------------------------------------------*
  772. *    Calculate tower index & interations        *
  773. *-------------------------------------------------------*
  774.     moveq        #4-1,d0
  775.     and.w        d2,d0                ; index = remainder(4)
  776.     lsr.w        #2,d2                ; loopsize / 4
  777.     neg.w        d0
  778.     add.w        d0,d0                ; index * -2
  779. *-------------------------------------------------------*
  780. *    Preload carry for cascading adder        *
  781. *-------------------------------------------------------*
  782.     lsl.l        #8,d4
  783.     swap        d4
  784.     move.w        d4,d1                ; store v[i]
  785.     add.l        d3,d4                ; v[i:f]=v[i:f]+dv[i:f]
  786.     move.w        d1,d4                ; restore v[i]
  787. *-------------------------------------------------------*
  788. *    Execute instruction tower            *
  789. *-------------------------------------------------------*
  790.     clr.l        d1
  791.     jmp        .dx_j(pc,d0.w*8)        ; jump -> index * -16
  792. .dx_l:    vrun16
  793.     vrun16
  794.     vrun16
  795.     vrun16
  796. .dx_j:    dbra        d2,.dx_l
  797. *-------------------------------------------------------*
  798.     dspwaitread.0    (a3)
  799.     move.w        (a1),d3                ; i (screen)
  800.     bpl        .next
  801. *-------------------------------------------------------*
  802. .dsp_done:
  803. *-------------------------------------------------------*
  804.     rts
  805.  
  806. *-------------------------------------------------------*
  807. render_wall_2x1:
  808. *-------------------------------------------------------*
  809.     move.w        bytewidth,a6
  810.     subq.l        #2,a6
  811.     sub.l        a6,a4
  812. *-------------------------------------------------------*
  813.     dspwaitread.0    (a3)
  814.     move.w        (a1),d3                ; i (screen)
  815.     bmi        .dsp_done
  816. *-------------------------------------------------------*
  817. .next:    moveq        #0,d1
  818.     dspwaitread.0    (a3)
  819.     move.w        (a1),d1                ; j1j2
  820.     lea        colourtables,a5
  821.     lea        (a4,d3.w*4),a0            ; address screen (i)
  822.     moveq        #0,d2
  823.     move.b        d1,d2                ; j2 (screen/bot)
  824.     lsr.w        #8,d1                ; j1 (screen/top)
  825.     sub.w        d1,d2                ; dj (height)
  826. ;    lsl.l        #4,d1
  827. ;    move.l        d1,d0
  828.     dspwaitread.0    (a3)
  829.     move.w        (a1),d4                ; z
  830.     lea        (a5,d4.w*8),a5            ; address luminance table
  831.     moveq        #0,d4
  832.     dspwaitread.3    (a3)
  833.     move.w        (a1),d4                ; u (texture)
  834. ;    lsl.l        #2,d1
  835. ;    add.l        d1,d0
  836. ;    lsl.l        #3,d0
  837.     move.l        d6,a2
  838.     add.l        d4,a2                ; address u (texture)
  839.     dspwaitread.0    (a3)
  840.     move.l        -2(a1),d3            ; dv[i:f] (texture)
  841. ;    add.l        d0,a0                ; address j (screen)
  842.     
  843.     mulu.w        bytewidth,d1    ****
  844.     add.l        d1,a0
  845.  
  846.     moveq        #0,d4
  847.     swap        d3
  848.     ext.w        d3
  849.     dspwaitread.3    (a3)
  850.     move.w        (a1),d4                ; v (texture)
  851. *-------------------------------------------------------*
  852. *    Calculate tower index & interations        *
  853. *-------------------------------------------------------*
  854.     moveq        #4-1,d0
  855.     and.w        d2,d0                ; index = remainder(4)
  856.     lsr.w        #2,d2                ; loopsize / 4
  857.     move.w        d0,d1
  858.     lsl.w        #3,d1
  859.     add.w        d1,d0
  860.     neg.w        d0                ; index * -9
  861. *-------------------------------------------------------*
  862. *    Preload carry for cascading adder        *
  863. *-------------------------------------------------------*
  864.     lsl.l        #8,d4
  865.     swap        d4
  866.     move.w        d4,d1                ; store v[i]
  867.     add.l        d3,d4                ; v[i:f]=v[i:f]+dv[i:f]
  868.     move.w        d1,d4                ; restore v[i]
  869. *-------------------------------------------------------*
  870. *    Execute instruction tower            *
  871. *-------------------------------------------------------*
  872.     clr.l        d1
  873.     jmp        .dx_j(pc,d0.w*2)        ; jump -> index * -16
  874. .dx_l:    vrun32
  875.     vrun32
  876.     vrun32
  877.     vrun32
  878. .dx_j:    dbra        d2,.dx_l
  879. *-------------------------------------------------------*
  880.     dspwaitread.0    (a3)
  881.     move.w        (a1),d3                ; i (screen)
  882.     bpl        .next
  883. *-------------------------------------------------------*
  884. .dsp_done:
  885. *-------------------------------------------------------*
  886.     rts
  887.  
  888. *-------------------------------------------------------*
  889. render_transparent:
  890. *-------------------------------------------------------*
  891.     
  892.     move.l        screen,a4
  893.     move.w        #128-1,d5
  894.  
  895.     tst.b        halfrows
  896.     bne        render_transparent_2x1
  897.  
  898. *-------------------------------------------------------*
  899. render_transparent_1x1:
  900. *-------------------------------------------------------*
  901.     move.w        bytewidth,a6
  902. *-------------------------------------------------------*
  903.     move.l        transparent_array,a3
  904.     move.w        transparent_count,d7
  905.     subq.w        #1,d7
  906.     bmi        .err
  907. *-------------------------------------------------------*
  908. .wall_loop:
  909. *-------------------------------------------------------*
  910.     swap        d7
  911.     move.w        -(a3),d7
  912. *-------------------------------------------------------*
  913. *    Case #1 - masked transparent            *
  914. *-------------------------------------------------------*
  915.     moveq        #0,d0
  916.     move.w        -(a3),d0
  917.     bpl.s        .masked_transparent
  918. *-------------------------------------------------------*
  919. *    Case #2 - alpha transparent            *
  920. *-------------------------------------------------------*
  921.     cmp.w        #texcode_qalpha,d0
  922.     bra        .alpha_transparent
  923. *-------------------------------------------------------*
  924. *    Case #3 - invalid transparent            *
  925. *-------------------------------------------------------*
  926.     bra        .skip_wall
  927. *-------------------------------------------------------*
  928. .masked_transparent:
  929. *-------------------------------------------------------*
  930.     bsr        cache_resource
  931.     move.l        d0,d6
  932. *-------------------------------------------------------*
  933. .column_loop:
  934. *-------------------------------------------------------*
  935.     lea        -14(a3),a3
  936.     move.l        a3,a1
  937.     move.w        (a1)+,d3            ; i (screen)
  938.     moveq        #0,d1
  939.     move.w        (a1)+,d1            ; j1j2
  940.     lea        colourtables,a5
  941.     lea        (a4,d3.w*2),a0            ; address screen (i)
  942.     moveq        #0,d2
  943.     move.b        d1,d2                ; j2 (screen/bot)
  944.     lsr.w        #8,d1                ; j1 (screen/top)
  945.     sub.w        d1,d2                ; dj (height)
  946. ;    lsl.l        #4,d1
  947. ;    move.l        d1,d0
  948.     move.w        (a1)+,d4            ; z
  949.     lea        (a5,d4.w*8),a5            ; address luminance table
  950.     moveq        #0,d4
  951.     move.w        (a1)+,d4            ; u (texture)
  952. ;    lsl.l        #2,d1
  953. ;    add.l        d1,d0
  954. ;    lsl.l        #3,d0
  955.     move.l        d6,a2
  956.     add.l        d4,a2                ; address u (texture)
  957.     move.l        (a1)+,d3            ; dv[i:f] (texture)
  958. ;    add.l        d0,a0                ; address j (screen)
  959.  
  960.     mulu.w        bytewidth,d1    ****
  961.     add.l        d1,a0
  962.  
  963.     moveq        #0,d4
  964.     swap        d3
  965.     ext.w        d3
  966.     move.w        (a1)+,d4            ; v (texture)
  967. *-------------------------------------------------------*
  968. *    Calculate tower index & interations        *
  969. *-------------------------------------------------------*
  970.     moveq        #4-1,d0
  971.     and.w        d2,d0                ; index = remainder(4)
  972.     lsr.w        #2,d2                ; loopsize / 4
  973.     add.w        d0,d0
  974.     neg.w        d0                ; index * -2
  975. *-------------------------------------------------------*
  976. *    Preload carry for cascading adder        *
  977. *-------------------------------------------------------*
  978.     lsl.l        #8,d4
  979.     swap        d4
  980.     move.w        d4,d1                ; store v[i]
  981.     add.l        d3,d4                ; v[i:f]=v[i:f]+dv[i:f]
  982.     move.w        d1,d4                ; restore v[i]
  983. *-------------------------------------------------------*
  984. *    Execute instruction tower            *
  985. *-------------------------------------------------------*
  986.     clr.l        d1
  987.     jmp        .dx_j(pc,d0.w*8)        ; jump -> index * -16
  988. .dx_l:    tvrun16
  989.     tvrun16
  990.     tvrun16
  991.     tvrun16
  992. .dx_j:    dbra        d2,.dx_l
  993. *-------------------------------------------------------*
  994.     dbra        d7,.column_loop
  995. *-------------------------------------------------------*
  996. .skip_wall:
  997. *-------------------------------------------------------*
  998.     swap        d7
  999.     dbra        d7,.wall_loop
  1000. .err:    rts
  1001.  
  1002. *-------------------------------------------------------*
  1003. .alpha_transparent:
  1004. *-------------------------------------------------------*
  1005.     lea        quick_alpha_table,a5
  1006. *-------------------------------------------------------*
  1007. .acolumn_loop:
  1008. *-------------------------------------------------------*
  1009.     lea        -14(a3),a3
  1010.     move.l        a3,a1
  1011.     move.w        (a1)+,d3            ; i (screen)
  1012.     moveq        #0,d1
  1013.     move.w        (a1)+,d1            ; j1j2
  1014.     lea        (a4,d3.w*2),a0            ; address screen (i)
  1015.     moveq        #0,d2
  1016.     move.b        d1,d2                ; j2 (screen/bot)
  1017.     lsr.w        #8,d1                ; j1 (screen/top)
  1018.     sub.w        d1,d2                ; dj (height)
  1019.  
  1020. ;    lsl.l        #4,d1
  1021. ;    move.l        d1,d0
  1022. ;    lsl.l        #2,d1
  1023. ;    add.l        d1,d0
  1024. ;    lsl.l        #3,d0
  1025. ;    add.l        d0,a0                ; address j (screen)
  1026.  
  1027.     mulu.w        bytewidth,d1    ****
  1028.     add.l        d1,a0
  1029.  
  1030. *-------------------------------------------------------*
  1031. *    Calculate tower index & interations        *
  1032. *-------------------------------------------------------*
  1033.     moveq        #4-1,d0
  1034.     and.w        d2,d0                ; index = remainder(4)
  1035.     lsr.w        #2,d2                ; loopsize / 4
  1036.  
  1037.     move.w        d0,d1
  1038.     add.w        d1,d1
  1039.     sub.w        d1,d0
  1040.     add.w        d1,d1
  1041.     sub.w        d1,d0                ; index * -5
  1042.     
  1043. ;    neg.w        d0                ; index * -1
  1044.  
  1045. *-------------------------------------------------------*
  1046. *    Execute instruction tower            *
  1047. *-------------------------------------------------------*
  1048.     sub.l        a6,a0
  1049.     clr.l        d1
  1050.     jmp        .adx_j(pc,d0.w*2)        ; jump -> index * -10
  1051. .adx_l:    avrun16
  1052.     avrun16
  1053.     avrun16
  1054.     avrun16
  1055. .adx_j:    dbra        d2,.adx_l
  1056. *-------------------------------------------------------*
  1057.     dbra        d7,.acolumn_loop
  1058. *-------------------------------------------------------*
  1059.     swap        d7
  1060.     dbra        d7,.wall_loop
  1061.     rts
  1062.  
  1063. *-------------------------------------------------------*
  1064. render_transparent_2x1:
  1065. *-------------------------------------------------------*
  1066.     move.w        bytewidth,a6
  1067. *-------------------------------------------------------*
  1068.     move.l        transparent_array,a3
  1069.     move.w        transparent_count,d7
  1070.     subq.w        #1,d7
  1071.     bmi        .err
  1072. *-------------------------------------------------------*
  1073. .wall_loop:
  1074. *-------------------------------------------------------*
  1075.     swap        d7
  1076.     move.w        -(a3),d7
  1077. *-------------------------------------------------------*
  1078. *    Case #1 - masked transparent            *
  1079. *-------------------------------------------------------*
  1080.     moveq        #0,d0
  1081.     move.w        -(a3),d0
  1082.     bpl.s        .masked_transparent
  1083. *-------------------------------------------------------*
  1084. *    Case #2 - alpha transparent            *
  1085. *-------------------------------------------------------*
  1086.     cmp.w        #texcode_qalpha,d0
  1087.     beq        .alpha_transparent
  1088. *-------------------------------------------------------*
  1089. *    Case #3 - invalid transparent            *
  1090. *-------------------------------------------------------*
  1091.     bra        .skip_wall
  1092. *-------------------------------------------------------*
  1093. .masked_transparent:
  1094. *-------------------------------------------------------*
  1095.     bsr        cache_resource
  1096.     move.l        d0,d6
  1097. *-------------------------------------------------------*
  1098. .column_loop:
  1099. *-------------------------------------------------------*
  1100.     lea        -14(a3),a3
  1101.     move.l        a3,a1
  1102.     move.w        (a1)+,d3            ; i (screen)
  1103.     moveq        #0,d1
  1104.     move.w        (a1)+,d1            ; j1j2
  1105.     lea        colourtables,a5
  1106.     lea        (a4,d3.w*4),a0            ; address screen (i)
  1107.     moveq        #0,d2
  1108.     move.b        d1,d2                ; j2 (screen/bot)
  1109.     lsr.w        #8,d1                ; j1 (screen/top)
  1110.     sub.w        d1,d2                ; dj (height)
  1111. ;    lsl.l        #4,d1
  1112. ;    move.l        d1,d0
  1113.     move.w        (a1)+,d4            ; z
  1114.     lea        (a5,d4.w*8),a5            ; address luminance table
  1115.     moveq        #0,d4
  1116.     move.w        (a1)+,d4            ; u (texture)
  1117. ;    lsl.l        #2,d1
  1118. ;    add.l        d1,d0
  1119. ;    lsl.l        #3,d0
  1120.     move.l        d6,a2
  1121.     add.l        d4,a2                ; address u (texture)
  1122.     move.l        (a1)+,d3            ; dv[i:f] (texture)
  1123. ;    add.l        d0,a0                ; address j (screen)
  1124.  
  1125.     mulu.w        bytewidth,d1    ****
  1126.     add.l        d1,a0
  1127.  
  1128.     moveq        #0,d0
  1129.     moveq        #0,d4
  1130.     swap        d3
  1131.     ext.w        d3
  1132.     move.w        (a1)+,d4            ; v (texture)
  1133. *-------------------------------------------------------*
  1134. *    Calculate tower index & interations        *
  1135. *-------------------------------------------------------*
  1136.     moveq        #4-1,d0
  1137.     and.w        d2,d0                ; index = remainder(4)
  1138.     lsr.w        #2,d2                ; loopsize / 4
  1139.     move.w        d0,d1
  1140.     add.w        d1,d1
  1141.     add.w        d1,d0
  1142.     lsl.w        #2,d1
  1143.     add.w        d1,d0
  1144.     neg.w        d0                ; index * -11
  1145. *-------------------------------------------------------*
  1146. *    Preload carry for cascading adder        *
  1147. *-------------------------------------------------------*
  1148.     lsl.l        #8,d4
  1149.     swap        d4
  1150.     move.w        d4,d1                ; store v[i]
  1151.     add.l        d3,d4                ; v[i:f]=v[i:f]+dv[i:f]
  1152.     move.w        d1,d4                ; restore v[i]
  1153. *-------------------------------------------------------*
  1154. *    Execute instruction tower            *
  1155. *-------------------------------------------------------*
  1156.     clr.l        d1
  1157.     jmp        .dx_j(pc,d0.w*2)        ; jump -> index * -22
  1158. .dx_l:    tvrun32
  1159.     tvrun32
  1160.     tvrun32
  1161.     tvrun32
  1162. .dx_j:    dbra        d2,.dx_l
  1163. *-------------------------------------------------------*
  1164.     dbra        d7,.column_loop
  1165. *-------------------------------------------------------*
  1166. .skip_wall:
  1167. *-------------------------------------------------------*
  1168.     swap        d7
  1169.     dbra        d7,.wall_loop
  1170. .err:    rts
  1171.  
  1172. *-------------------------------------------------------*
  1173. .alpha_transparent:
  1174. *-------------------------------------------------------*
  1175.     lea        quick_alpha_table,a5
  1176.     subq.l        #2*2,a6
  1177. *-------------------------------------------------------*
  1178. .acolumn_loop:
  1179. *-------------------------------------------------------*
  1180.     lea        -14(a3),a3
  1181.     move.l        a3,a1
  1182.     move.w        (a1)+,d3            ; i (screen)
  1183.     moveq        #0,d1
  1184.     move.w        (a1)+,d1            ; j1j2
  1185.     lea        (a4,d3.w*4),a0            ; address screen (i)
  1186.     moveq        #0,d2
  1187.     move.b        d1,d2                ; j2 (screen/bot)
  1188.     lsr.w        #8,d1                ; j1 (screen/top)
  1189.     sub.w        d1,d2                ; dj (height)
  1190.  
  1191. ;    lsl.l        #4,d1
  1192. ;    move.l        d1,d0
  1193. ;    lsl.l        #2,d1
  1194. ;    add.l        d1,d0
  1195. ;    lsl.l        #3,d0
  1196. ;    add.l        d0,a0                ; address j (screen)
  1197.     
  1198.     mulu.w        bytewidth,d1    ****
  1199.     add.l        d1,a0
  1200.  
  1201. *-------------------------------------------------------*
  1202. *    Calculate tower index & interations        *
  1203. *-------------------------------------------------------*
  1204.     moveq        #4-1,d0
  1205.     and.w        d2,d0                ; index = remainder(4)
  1206.     lsr.w        #2,d2                ; loopsize / 4
  1207.     move.w        d0,d1
  1208.     lsl.w        #3,d1
  1209.     sub.w        d1,d0                ; index * -7
  1210. *-------------------------------------------------------*
  1211. *    Execute instruction tower            *
  1212. *-------------------------------------------------------*
  1213.     clr.l        d1
  1214.     sub.l        a6,a0
  1215.     jmp        .adx_j(pc,d0.w*2)        ; jump -> index * -14
  1216. .adx_l:    avrun32
  1217.     avrun32
  1218.     avrun32
  1219.     avrun32
  1220. .adx_j:    dbra        d2,.adx_l
  1221. *-------------------------------------------------------*
  1222.     dbra        d7,.acolumn_loop
  1223. *-------------------------------------------------------*
  1224.     addq.l        #2*2,a6
  1225.     swap        d7
  1226.     dbra        d7,.wall_loop
  1227.     rts
  1228.  
  1229. *-------------------------------------------------------*
  1230. *    Draw composite texture to the screen        *
  1231. *-------------------------------------------------------*
  1232. render_texture:
  1233. *-------------------------------------------------------*
  1234.     bsr        clear_patchtags
  1235.     bsr        load_patches
  1236.     bsr        add_patches
  1237.     rts
  1238.     
  1239. *-------------------------------------------------------*
  1240. *    Load all unique patches into temp buffer    *
  1241. *-------------------------------------------------------*
  1242. load_patches:
  1243. *-------------------------------------------------------*
  1244.     pushall
  1245. ;    move.l        texturelist_array,a0
  1246.     move.l        graphics_array,a0
  1247.     move.l        (a0,d0.w*4),a0
  1248.     move.w        tex_width(a0),patch_xclip
  1249.     move.w        tex_height(a0),patch_yclip
  1250.     move.w        tex_patches(a0),d6
  1251.     lea        tex_len(a0),a0
  1252.     bra.s        .go
  1253. .all:    move.w        texp_index(a0),d0
  1254.     lea        patch_taglist,a1
  1255.     move.w        patch_tags,d1
  1256.     bra.s        .tgo
  1257. .tlp:    cmp.w        (a1),d0
  1258.     beq.s        .old
  1259.     addq.l        #6,a1
  1260. .tgo:    dbra        d1,.tlp
  1261.     addq.w        #1,patch_tags
  1262.     move.w        d0,(a1)+
  1263.     move.l        patchbuffer_ptr,(a1)+
  1264.     pushall
  1265.     move.l        pnamelist_array,a2
  1266.     move.l        (a2,d0.w*4),d1
  1267.     beq        .skip
  1268.     move.l        d1,a0
  1269.     move.l        patchbuffer_ptr,a1
  1270.     move.l        wd_size(a0),d1
  1271.     add.l        d1,patchbuffer_ptr
  1272.     bsr        read_resource
  1273. .skip:    popall
  1274. .old:    lea        texp_len(a0),a0
  1275. .go:    dbra        d6,.all
  1276.     popall
  1277.     rts
  1278.  
  1279. *-------------------------------------------------------*
  1280. *    Prepare to load unique patches using tags    *
  1281. *-------------------------------------------------------*
  1282. clear_patchtags:
  1283. *-------------------------------------------------------*
  1284.     clr.w        patch_tags
  1285.     move.l        #buffer_space,patchbuffer_ptr
  1286.     move.w        #max_patches,d1
  1287.     lea        patch_taglist,a1
  1288.     bra.s        .fgo
  1289. .flp:    move.w        #terminator,(a1)+
  1290.     addq.l        #4,a1
  1291. .fgo:    dbra        d1,.flp
  1292.     rts
  1293.     
  1294. *-------------------------------------------------------*
  1295. *    Build texture up from patches            *
  1296. *-------------------------------------------------------*
  1297. add_patches:
  1298. *-------------------------------------------------------*
  1299.     pushall
  1300.     move.l        graphics_array,a0
  1301. ;    move.l        texturelist_array,a0
  1302.     move.l        (a0,d0.w*4),a0
  1303.     move.w        tex_width(a0),patch_xclip
  1304.     move.w        tex_height(a0),patch_yclip
  1305.     move.w        tex_patches(a0),d6
  1306.     lea        tex_len(a0),a0
  1307.     bra.s        .go
  1308. .all:    move.w        texp_xoff(a0),patch_xoff
  1309.     move.w        texp_yoff(a0),patch_yoff
  1310.     move.w        texp_index(a0),patch_index
  1311.     push.w        d6
  1312.     push.l        a0
  1313.     bsr        render_patch_tex
  1314.     pop.l        a0
  1315.     pop.w        d6
  1316.     lea        texp_len(a0),a0
  1317. .go:    dbra        d6,.all
  1318.     popall
  1319.     rts
  1320.  
  1321. *-------------------------------------------------------*
  1322. *    Draw one patch as a section of a texture    *
  1323. *-------------------------------------------------------*
  1324. render_patch:
  1325. *-------------------------------------------------------*
  1326.     move.w        patch_index,d0
  1327.     move.w        patch_tags,d1
  1328.     lea        patch_taglist,a1
  1329.     bra.s        .fgo
  1330. .flp:    cmp.w        (a1),d0
  1331.     beq.s        .got
  1332.     addq.l        #6,a1
  1333. .fgo:    dbra        d1,.flp
  1334.     bra        .err
  1335. .got:    addq.l        #2,a1
  1336.     move.l        (a1)+,a0
  1337.     move.l        ScreenPhy,a3
  1338.     lea        colourtables+(63*512),a5
  1339.     move.l        a0,a1
  1340.     imov.w        (a0)+,d6            ; width
  1341.     imov.w        (a0)+,d7            ; height
  1342.     imov.w        (a0)+,d0            ; xoff
  1343.     imov.w        (a0)+,d1            ; yoff
  1344.     move.w        patch_yclip,d5
  1345.     move.w        patch_yoff,d1
  1346.     move.w        patch_xoff,d0
  1347.     bpl.s        .xok
  1348.     add.w        d0,d6
  1349.     ble        .err
  1350.     neg.w        d0
  1351.     lea        (a0,d0.w*4),a0
  1352.     moveq        #0,d0
  1353. .xok:    lea        (a3,d0.w*2),a3
  1354.     add.w        d6,d0
  1355.     sub.w        patch_xclip,d0
  1356.     ble.s        .go
  1357.     sub.w        d0,d6
  1358.     ble        .err
  1359.     bra.s        .go
  1360. .col:    imov.l        (a0)+,a2
  1361.     add.l        a1,a2                ; post data
  1362. .next:    moveq        #0,d0
  1363.     move.b        (a2)+,d0
  1364.     cmp.b        #255,d0
  1365.     beq.s        .stop
  1366.     move.w        d1,d2                ; base y-offset
  1367.     add.w        d0,d2                ; post y-offset
  1368.     move.w        d2,d3
  1369.     muls.w        bytewidth,d3
  1370. ;    muls.w        #(max_xres*2),d3
  1371.     lea        (a3,d3.l),a4
  1372.     moveq        #0,d0
  1373.     move.b        (a2)+,d0            ; post length
  1374.     moveq        #0,d3
  1375.     addq.l        #1,a2
  1376.     bra.s        .vgo
  1377. .vert:    move.b        (a2)+,d3
  1378.     tst.w        d2
  1379.     bmi.s        .skip
  1380.     cmp.w        d5,d2
  1381.     bpl.s        .skip
  1382.     move.w        (a5,d3.w*2),(a4)
  1383. .skip:    addq.w        #1,d2
  1384.     add.w        bytewidth,a4
  1385. ;    lea        (max_xres*2)(a4),a4
  1386. .vgo:    dbra        d0,.vert
  1387.     addq.l        #1,a2
  1388.     bra.s        .next
  1389. .stop:    addq.l        #2,a3
  1390. .go:    dbra        d6,.col
  1391. .err:    rts
  1392.  
  1393. *-------------------------------------------------------*
  1394. *    Draw one patch as a section of a texture    *
  1395. *-------------------------------------------------------*
  1396. render_patch_tex:
  1397. *-------------------------------------------------------*
  1398.     move.w        patch_index,d0
  1399.     move.w        patch_tags,d1
  1400.     lea        patch_taglist,a1
  1401.     bra.s        .fgo
  1402. .flp:    cmp.w        (a1),d0
  1403.     beq.s        .got
  1404.     addq.l        #6,a1
  1405. .fgo:    dbra        d1,.flp
  1406.     bra        .err
  1407. .got:    addq.l        #2,a1
  1408.     move.l        (a1)+,a0
  1409.     move.l        texture_ptr,a3
  1410.     move.l        a0,a1
  1411.     imov.w        (a0)+,d6            ; width
  1412.     imov.w        (a0)+,d7            ; height
  1413.     imov.w        (a0)+,d0            ; xoff
  1414.     imov.w        (a0)+,d1            ; yoff
  1415.     move.w        black,d7
  1416.     move.w        patch_yclip,d5
  1417.     move.w        patch_yoff,d1
  1418.     move.w        patch_xoff,d0
  1419.     bpl.s        .xok
  1420.     add.w        d0,d6
  1421.     ble        .err
  1422.     neg.w        d0
  1423.     lea        (a0,d0.w*4),a0
  1424.     moveq        #0,d0
  1425. .xok:    move.w        d0,d3
  1426.     mulu.w        patch_yclip,d3
  1427.     add.l        d3,a3
  1428.     add.w        d6,d0
  1429.     sub.w        patch_xclip,d0
  1430.     ble.s        .go
  1431.     sub.w        d0,d6
  1432.     ble        .err
  1433.     bra.s        .go
  1434. .col:    imov.l        (a0)+,a2
  1435.     add.l        a1,a2                ; post data
  1436. .next:    moveq        #0,d0
  1437.     move.b        (a2)+,d0
  1438.     cmp.b        #255,d0
  1439.     beq.s        .stop
  1440.     move.w        d1,d2                ; base y-offset
  1441.     add.w        d0,d2                ; post y-offset
  1442.     move.w        d2,d3
  1443.     lea        (a3,d3.w),a4
  1444.     moveq        #0,d0
  1445.     move.b        (a2)+,d0            ; post length
  1446.     moveq        #0,d3
  1447.     addq.l        #1,a2
  1448.     bra.s        .vgo
  1449. .vert:    tst.w        d2
  1450.     bmi.s        .skip
  1451.     cmp.w        d5,d2
  1452.     bpl.s        .skip
  1453.     move.b        (a2),d3
  1454.     bne.s        .nz
  1455.     move.b        d7,d3
  1456. .nz:    move.b        d3,(a4)
  1457. .skip:    addq.l        #1,a2
  1458.     addq.w        #1,d2
  1459.     addq.l        #1,a4
  1460. .vgo:    dbra        d0,.vert
  1461.     addq.l        #1,a2
  1462.     bra.s        .next
  1463. .stop:    add.w        patch_yclip,a3
  1464. .go:    dbra        d6,.col
  1465. .err:    rts
  1466.  
  1467. xoff:            ds.l    1
  1468. skyx:            ds.l    1
  1469. skyy:            ds.l    1
  1470.     
  1471. texture_ptr:        ds.l    1
  1472.  
  1473. *-------------------------------------------------------*
  1474.             datlong
  1475. *-------------------------------------------------------*
  1476.  
  1477. wall_texture_file:    ;incbin    data\wall8bit.apx
  1478. wall_texture:    =    wall_texture_file+20+768
  1479.  
  1480. *-------------------------------------------------------*
  1481.             bsslong
  1482. *-------------------------------------------------------*
  1483.  
  1484. patchbuffer_ptr:    ds.l    1
  1485.  
  1486. colourtables:        ds.w    256*64            ; space for 64 light levels of palette
  1487. quick_alpha_table:    ds.w    65536            ; space for quick-alpha indexes
  1488.  
  1489. patch_xclip:        ds.w    1            ; patch dimensions & clipping rectangle
  1490. patch_yclip:        ds.w    1
  1491. patch_xoff:        ds.w    1
  1492. patch_yoff:        ds.w    1
  1493. patch_index:        ds.w    1
  1494. patch_tags:        ds.w    1
  1495.  
  1496. patch_taglist:        ds.b    (2+4)*max_patches    ; space for list of unique patch tags
  1497. buffer_space:        ds.b    65536            ; space for all patches in texture
  1498.  
  1499. final_flat:        ds.b    1            ; flag for last texture run
  1500.  
  1501. *-------------------------------------------------------*
  1502.             txtlong
  1503. *-------------------------------------------------------*
  1504.